#include <iostream>
#include <vector>
using namespace std;

namespace MY
{
	template<size_t N>
	class bitset
	{
	public:
		bitset()
		{
			bs.resize(N / 32 + 1, 0);
		}
		void set(size_t x)
		{
			size_t i = x / 32;
			size_t j = x % 32;

			bs[i] |= (1 << j);
		}
		void reset(size_t x)
		{
			size_t i = x / 32;
			size_t j = x % 32;

			bs[i] &= (~(1 << j));
		}
		bool test(size_t x)
		{
			size_t i = x / 32;
			size_t j = x % 32;
			
			return bs[i] & (1 << j);
		}
	private:
		vector<size_t> bs;
	};

	template<size_t N>
	class twobitset
	{
	public:
		void set(size_t x)
		{
			bool bt1 = bs1.test(x);
			bool bt2 = bs2.test(x);

			if (!bt1 && !bt2)
			{
				bs2.set(x);
			}
			else if (!bt1 && bt2)
			{
				bs2.reset(x);
				bs1.set(x);
			}
			else if (bt1 && !bt2)
			{
				bs2.set(x);
			}
		}
		void reset(size_t x)
		{
			bool bt1 = bs1.test(x);
			bool bt2 = bs2.test(x);

			if (!bt1 && bt2)
			{
				bs2.reset(x);
			}
			else if (bt1 && !bt2)
			{
				bs1.reset(x);
				bs2.set(x);
			}
			else if (bt1 && bt2)
			{
				bs2.reset(x);
			}
		}
		int get_count(size_t x)
		{
			bool bt1 = bs1.test(x);
			bool bt2 = bs2.test(x);

			if (!bt1 && !bt2)
			{
				return 0;
			}
			else if (!bt1 && bt2)
			{
				return 1;
			}
			else if (bt1 && !bt2)
			{
				return 2;
			}
			else {
				return 3;
			}
		}
	private:
		bitset<N> bs1;
		bitset<N> bs2;
	};
}

// 模拟位图找交集
void test_bitset1()
{
	int a1[] = { 5,7,9,2,5,99,5,5,7,5,3,9,2,55,1,5,6 };
	int a2[] = { 5,3,5,99,6,99,33,66 };
	MY::bitset<100> bs1;
	MY::bitset<100> bs2;
	for (auto e : a1)
	{
		bs1.set(e);
	}
	for (auto e : a2)
	{
		bs2.set(e);
	}
	for (size_t i = 0; i < 100; i++)
	{
		if (bs1.test(i) && bs2.test(i))
		{
			cout << i << endl;
		}
	}
}

void test_bitset2()
{
	MY::twobitset<100> tbs;
	int a[] = { 5,7,9,2,5,99,5,5,7,5,3,9,2,55,1,5,6,6,6,6,7,9 };
	for (auto e : a)
	{
		tbs.set(e);
	}
	for (size_t i = 0; i < 100; ++i)
	{
		//cout << i << "->" << tbs.get_count(i) << endl;
		if (tbs.get_count(i) == 1 || tbs.get_count(i) == 2)
		{
			cout << i << endl;
		}
		/*if (tbs.get_count(i) >= 3)
		{
			cout << i << endl;
		}*/
	}
}

int main()
{
	//test_bitset1();
	test_bitset2();

	return 0;
}

//int main()
//{
//	/*MY::bitset<100> bs;
//	bs.set(32);
//	bs.set(33);
//	bs.reset(33);
//	bs.set(34);
//	bs.set(31);*/
//
//	MY::bitset<100> bs1;
//	bs1.set(50);
//	bs1.set(30);
//	bs1.set(90);
//	for (size_t i = 0; i < 100; i++)
//	{
//		if (bs1.test(i))
//		{
//			cout << i << "->" << "在" << endl;
//		}
//		else
//		{
//			cout << i << "->" << "不在" << endl;
//		}
//	}
//	bs1.reset(90);
//	bs1.set(91);
//	cout << endl << endl;
//	for (size_t i = 0; i < 100; i++)
//	{
//		if (bs1.test(i))
//		{
//			cout << i << "->" << "在" << endl;
//		}
//		else
//		{
//			cout << i << "->" << "不在" << endl;
//		}
//	}
//	// 开2^32个位的位图
//	//bit::bitset<-1> bs2;
//	//bit::bitset<UINT_MAX> bs3;
//	//bit::bitset<0xffffffff> bs4;
//	return 0;
//}